# author: LiuShihao
# data: 2020/11/26 3:03 下午
# youknow: 各位老铁,我的这套代码曾经有人出价三个亿我没有卖,如今拿出来和大家分享,不求别的,只求大家免费的小红心帮忙点一点,这里谢过了。
# desc: 函数的学习
"""
函数的创建：
def 函数名 （[参数]）:
	函数体
	[return xxx]
"""
# 函数的创建
def calc(a,b):
    c = a + b
    return c
# 函数的调用   直接使用函数名调用
result = calc(10,20)
print(result)
result = calc(b=10,a=20)
print(result)
"""
函数的参数传递：
def calc(a,b):       a、b称为形式参数，简称形参， 位置是在函数的定义处
    c = a + b        10、20成为实际参数，简称实参，位置是在函数的调用处
    return c
    1.位置实参  def calc（10，20）  根据形参的相应位置进行实参传递
    2.关键字实参def calc（b=10,a=20）根据形参名进行实参传递  形参名称=实参值
"""
def fun(num):  # 函数返回多个值时，结果为元组
    odd=[]
    even=[]
    for item in num:
        if item%2:
            even.append(item)
        else:
            odd.append(item)
    return odd,even

num = [12,43,46,22,3,54,23]
result = fun(num)  # 返回的是一个元组
print(result)
"""
函数的返回值：
    1.可以没有返回值
    2.如果返回的只有一个值，直接返回类型
    3.如果返回的多个值，则返回元组类型
"""
# 函数定义默认参数值   b成为默认值参数
def fun(a,b=10):
    return a+b
print(fun(10))   # 如果只传入一个参数，则b使用默认值10
print(fun(10,b=20))# 如果传入时有b的值，则b不采用默认值使用传入时的值
print('hello',end='\t')  # end是print函数的默认值参数  end默认为/n换行
print('world')

def fun(*args):
    print(args)
fun(10)
fun(12,23,45,15)
def fun(**args):
    print(args)
fun(a=10)
fun(a=10,b=20,c=30)
# 变量的作用域
def fun(a,b):
    c = a+b  # c成为局部变量，定义在函数内部，只能在函数内部使用，不能在函数外部使用
    return c
fun(10,20)
name = 'lsh'
def fun():
    print(name)  # name称为全局变量，在函数内外都可以使用
fun()
def fun() :
    global age    #在函数内部定义age变量 是局部变量  但是使用global成为全局变量
    age = 20
    print(age)
fun()
print(age)

# 递归函数  自己调自己
# 使用递归来计算阶乘   6！ = 6*5*4*3*2*1
def fac(n):
    if n == 1:
        return 1
    else:
        res = n*fac(n-1)
        return res
print(fac(6))
# 斐波那契数列   当前项的数字等于前两项之和  ：1 1 2 3 5 8 13 21 ...
def fin(n):
    if n == 1:
        return 1
    elif n==2:
        return 1
    else:
        return fin(n-1)+fin(n-2)
print(fin(6))
# 输出这个序列的前六位数组
for i in range(1,7):
    print(fin(i),end='\t')





